import axios from 'axios'
import JSONBIG from 'json-bigint'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { ElMessage } from 'element-plus'
import store from '@/store'
import { isCheckTimeout } from '@/utils/auth'
import router from '@/router'

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 基础路径
  transformResponse: (data) => {
    try {
      const json = JSONBIG({
        storeAsString: true
      })
      const res = json.parse(data)
      return res
    } catch (error) { }
  },
  timeout: 5000

})

service.interceptors.request.use((config) => {
  // eslint-disable-next-line no-undef
  NProgress.start()
  config.headers.icode = 'helloqianduanxunlianying'

  if (store.getters.token) {
    // 如果token存在
    // 先看看是否token过期
    if (isCheckTimeout()) {
      // 登出操作
      store.dispatch('user/logout')
      return Promise.reject(new Error('token 失效'))
    }

    // 再设置请求头 token
    config.headers.Authorization = `Bearer ${store.getters.token}`
  }
  return config
})
service.interceptors.response.use(
  (response) => {
    // eslint-disable-next-line no-undef
    NProgress.done()
    // 3.成功返回的数据不再是response,而直接是响应体数据response.data

    const { success, message } = response.data
    //   要根据success的成功与否决定下面的操作
    if (success) {
      return response.data
    } else {
      // 业务错误
      ElMessage.error(message) // 提示错误消息
      return Promise.reject(new Error(message))
    }
  },
  (error) => {
    // eslint-disable-next-line no-undef
    NProgress.done()
    ElMessage.error(error.message)
    console.log('axioserror', error)
    // 处理 token 超时问题
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 401
    ) {
      // token超时
      store.dispatch('user/logout')
      // 需要重新跳转路由，因为我们虽然有在路由前置守卫中设置,但是是在路由路径有变化之前去校验本地有没有token是否过期的
      // 但是当用户进来页面的时候路由是没有跳转的
      router.push('/login')
    }
    // 一定要写成这样，阻断promise
    return Promise.reject(error.message)
  }
)

export default service
